package com.shareyi.baseproject.kernel.common.retry;

import com.alibaba.fastjson.JSON;
import com.shareyi.baseproject.kernel.common.constants.CacheConstants;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.io.Serializable;

/**
 * 重试消息信息
 *
 * @author david
 * @date 2020/03/24
 */
@Data
@ToString
@NoArgsConstructor
public class RetryMessageBo implements Serializable {
    /**
     * 消息业务代码；
     * 当前整个应用复用一个重试topic（后续也可根据情况分拆）
     * 通过业务类型区分具体的重试含义；
     */
    private String bizCode;
    /**
     * 消息内容
     */
    private String content;
    /**
     * 时间戳
     */
    private Long timestamp;
    /**
     * 当前版本
     */
    private Long version;

    /**
     * 扩展信息
     */
    private String ext;
    /**
     * 业务主键
     */
    private String bizKey;


    private RetryMessageBo(String bizCode, String content, String bizKey, Long version, Long timestamp) {
        this.bizCode = bizCode;
        this.content = content;
        this.version = version;
        this.bizKey = bizKey;
        this.timestamp = timestamp;
    }

    /**
     * 创建消息体
     *
     * @param bizCode
     * @param content
     * @param bizKey
     * @param version
     * @param timestamp
     * @return
     */
    public static RetryMessageBo create(String bizCode, String content, String bizKey, Long version, Long timestamp) {
        return new RetryMessageBo(bizCode, content, bizKey, version, timestamp);
    }

    /**
     * 通过json重构
     *
     * @param text
     * @return
     */
    public static RetryMessageBo createFromJson(String text) {
        return JSON.parseObject(text, RetryMessageBo.class);
    }

    /**
     * 构建加锁使用的key
     *
     * @return
     */
    public String buildLockKey() {
        return CacheConstants.LOCK_PRE + getBizCode() + "_" + getBizKey();
    }

    /**
     * 构建版本key
     *
     * @return
     */
    public String buildVersionKey() {
        return CacheConstants.SYS_RETRY_VERSION + getBizCode() + "_" + getBizKey();
    }


    /**
     * 版本比较
     * <p>
     * 如果外部版本为空，或者本版本打印
     *
     * @param outerVersion
     * @return
     */
    public int compareVersion(Long outerVersion) {
        if (outerVersion == null) {
            return 1;
        }
        return version.compareTo(outerVersion);
    }
}
